﻿
// CWindApp类Dlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "CWindApp类.h"
#include "CWindApp类Dlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CCWindApp类Dlg 对话框



CCWindApp类Dlg::CCWindApp类Dlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_CWINDAPP_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCWindApp类Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CCWindApp类Dlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_DESTROY()
END_MESSAGE_MAP()


// CCWindApp类Dlg 消息处理程序

BOOL CCWindApp类Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时，框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码


#if PRIVATE
	//得到exe路径：
	wchar_t exePath[MAX_PATH];
	GetModuleFileName(NULL, exePath, MAX_PATH);	//检索包含指定模块的文件的完全限定路径	包括文件名！

	//调整字符串 拿到路径：
	CString str = exePath;
	str = str.Left(str.ReverseFind('\\')/*在较大的字符串中查找字符；从末尾开始	；
									此 CStringT 对象中的、与请求的字符匹配的最后一个字符的从零开始的索引，如果找不到该字符，则返回 -1。*/
					);//提取字符串的左侧部分
	//这两个CStringT类的函数用在一起	ReverseFind函数先寻找完全限定路径中的\\	找到后返回最后一个字符的索引，然后Left函数就读取该索引左侧的字符串内容
	str += L"\\CWindApp类.ini";	//配置文件的配置路径

	int left = GetPrivateProfileInt(L"Position", L"left", 0, str);
	int right = GetPrivateProfileInt(L"Position", L"right", 0, str);
	int top = GetPrivateProfileInt(L"Position", L"top", 0, str);
	int bottom = GetPrivateProfileInt(L"Position", L"bottom", 0, str);
	//设置当前窗口：
	MoveWindow(left, top, right - left, bottom - top);
#else
		//读配置文件
			//读数据的时候就是在程序开始初始化的地方 所以在这里读配置文件

		//1.读配置文件
		int left	= theApp.GetProfileInt(L"Position", L"left", 0/*是默认值	默认值为0*/);	//从应用程序的 .INI 文件中的条目中检索整数的函数
		int right	= theApp.GetProfileInt(L"Position", L"right", 0/*是默认值	默认值为0*/);	//从应用程序的 .INI 文件中的条目中检索整数的函数
		int top		= theApp.GetProfileInt(L"Position", L"top", 0/*是默认值	默认值为0*/);	//从应用程序的 .INI 文件中的条目中检索整数的函数
		int bottom	= theApp.GetProfileInt(L"Position", L"bottom", 0/*是默认值	默认值为0*/);	//从应用程序的 .INI 文件中的条目中检索整数的函数

		//设置当前窗口：
		MoveWindow(left, top, right - left, bottom - top);
		//推荐以管理员身份运行visual studio2022	就不会再去文件所在位置找应用程序运行那么麻烦了
		/*	以管理员身份运行	任意设置对话框窗口的大小，	关掉程序		再次运行	 你就会发现	这次运行的窗口出现在上次运行结束之前的位置，大小也是上次运行结束的大小*/
#endif









#if 0
	//弹出：		了解看下就行了
	MessageBox(theApp.m_pszAppName);		//指定应用程序的名称
	MessageBox(theApp.m_pszAppID);			//应用程序用户模型ID
	MessageBox(theApp.m_pszExeName);		//应用程序的模块名称
	MessageBox(theApp.m_pszHelpFilePath);	//指向应用程序帮助文件的路径
	MessageBox(theApp.m_pszProfileName);	//应用程序的.INI文件名
	MessageBox(theApp.m_pszRegistryKey);	//用于确定用来存储应用程序配置文件设置的完整注册表项
#endif

	//AfxMessageBox(L"看看我");	//这个弹窗的特点是自动的带工程的文件名












	return TRUE;  // 除非将焦点设置到控件，否则返回 TRUE
}

void CCWindApp类Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮，则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序，
//  这将由框架自动完成。

void CCWindApp类Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CCWindApp类Dlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


//关闭窗口	真正调用的地方：（写文件就是在程序关闭销毁的地方进行保存的！！！！！！！！！！）
	//close也会相应destroy，所以还不如在最根本的地方去做事情 好一点
void CCWindApp类Dlg::OnDestroy()
{
	CDialogEx::OnDestroy();

	// TODO: 在此处添加消息处理程序代码

	//获取对话框的位置
	RECT rect = { 0 };
	GetWindowRect(&rect);


#if PRIVATE
	//GetPrivateProfileInt

	//得到exe路径：
	wchar_t exePath[MAX_PATH];
	GetModuleFileName(NULL, exePath, MAX_PATH);	//检索包含指定模块的文件的完全限定路径	包括文件名！

	//调整字符串 拿到路径：
	CString str = exePath;
	str = str.Left(str.ReverseFind('\\')/*在较大的字符串中查找字符；从末尾开始	；	
									此 CStringT 对象中的、与请求的字符匹配的最后一个字符的从零开始的索引，如果找不到该字符，则返回 -1。*/
			);//提取字符串的左侧部分
	//这两个CStringT类的函数用在一起	ReverseFind函数先寻找完全限定路径中的\\	找到后返回最后一个字符的索引，然后Left函数就读取该索引左侧的字符串内容
	str += L"\\CWindApp类.ini";	//配置文件的配置路径

	//AfxMessageBox(str);

	wchar_t buff[50];

	wsprintf(buff, L"%d", rect.left);
	WritePrivateProfileString(L"Position", L"left", buff/*rect是整数类型 而这里需要的是字符串类型，转换一下*/, str);
	wsprintf(buff, L"%d", rect.right);
	WritePrivateProfileString(L"Position", L"right", buff/*rect是整数类型 而这里需要的是字符串类型，转换一下*/, str);
	wsprintf(buff, L"%d", rect.top);
	WritePrivateProfileString(L"Position", L"top", buff/*rect是整数类型 而这里需要的是字符串类型，转换一下*/, str);
	wsprintf(buff, L"%d", rect.bottom);
	WritePrivateProfileString(L"Position", L"bottom", buff/*rect是整数类型 而这里需要的是字符串类型，转换一下*/, str);
#else
		//写进去		配置文件中
		theApp.WriteProfileInt(L"Position",L"left",rect.left);		//将整数写入应用程序的 .INI 文件中的条目的函数
		theApp.WriteProfileInt(L"Position",L"right",rect.right);		//将整数写入应用程序的 .INI 文件中的条目的函数
		theApp.WriteProfileInt(L"Position",L"top",rect.top);		//将整数写入应用程序的 .INI 文件中的条目的函数
		theApp.WriteProfileInt(L"Position",L"bottom",rect.bottom);		//将整数写入应用程序的 .INI 文件中的条目的函数
	
		//默认的配置文件的位置在 C:\\Windows 文件夹下
#endif


}
